"""
给你一个非负整数数组nums，你最初位于数组的第一个位置。
数组中的每个元素代表你在该位置可以跳跃的最大长度。
你的目标是使用最少的跳跃次数到达数组的最后一个位置。
假设你总是可以到达数组的最后一个位置。

示例 1:
输入: nums = [2,3,1,1,4]
输出: 2
解释: 跳到最后一个位置的最小跳跃数是 2。
    从下标为 0 跳到下标为 1 的位置，跳1步，然后跳3步到达数组的最后一个位置。

示例 2:
输入: nums = [2,3,0,1,4]
输出: 2

链接：https://leetcode-cn.com/problems/jump-game-ii
"""
from mode import List


class Solution:
    def jump(self, nums: List[int]) -> int:
        if len(nums) == 1:
            return 0
        ans = 0
        # 当前覆盖最远距离下标
        curDistance = 0
        # 下一步覆盖最远距离下标
        nextDistance = 0
        for i in range(len(nums)):
            # 更新下一步覆盖最远距离下标
            nextDistance = max(i + nums[i], nextDistance)
            # 遇到当前覆盖最远距离下标
            if i == curDistance:
                # 如果当前覆盖最远距离下标不是终点
                if curDistance != len(nums) - 1:
                    # 需要走下一步
                    ans += 1
                    # 更新当前覆盖最远距离下标（相当于加油了）
                    curDistance = nextDistance
                    # 下一步的覆盖范围已经可以达到终点，结束循环
                    if nextDistance >= len(nums) - 1:
                        break
                # 当前覆盖最远距离下标是集合终点，不用做ans++操作了，直接结束
        return ans


class Solution1:
    def jump(self, nums: List[int]) -> int:
        n = len(nums)
        if n == 0:
            return 0
        curDistance = 0
        nextDistance = 0
        step = 0

        for i in range(n):
            nextDistance = max(nums[i] + i, nextDistance)
            if i == curDistance:
                if curDistance != n - 1:
                    step += 1
                    curDistance = nextDistance
                    if nextDistance >= n - 1:
                        break
        return step


if __name__ == "__main__":
    A = Solution()
    print(A.jump([0]))
    A = Solution1()
    print(A.jump([0]))
